﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using BatailleNavale.Properties;
using System.Collections;

namespace BatailleNavale
{
    class Placement
    {
        private bool bateauSelect = false; //true si un bateau a été sélectionné, false si non.
        private int tailleBateauSelect; // taille du bateau 2/3/4/5

        private bool premierClickDeCase = false; // une fois le bateau clické, true = premier click de case de placement du bateau 
        private int[] coordX = new int[2]; // coordonnées d'un navire
        private int[] coordY = new int[2];
        private bool secondClickDeCase = false; // vérifie le second click de case qui va indicer l'horizontalité et verticalité
        private List<Bateau> listeBateau = new List <Bateau>();
        public Form1 _form;

        public void addForm(Form1 laForm)
        {
            _form = laForm;
        }  //ajoute la form afin de la connaître

        public void AddBateau(Bateau bat)
        {
            listeBateau.Add(bat);
            int nbCroiseur=0;
            int nbsousMarin = 0;
            int nbTorpilleur = 0;
            foreach (Bateau b in listeBateau)
            {
                if (b.getTaille() == 5)
                {
                    _form.porteAvionGif.Visible = false;
                    _form.porteAvionNB.Visible = false;
                }
                if (b.getTaille() == 4)
                {
                    nbCroiseur = nbCroiseur + 1;
                    if (nbCroiseur == 2)
                    {
                        _form.croiseurGif.Visible = false;
                        _form.croiseurNB.Visible = false;
                    }
                    else
                    {
                        _form.croiseurNB.Text = "x1";
                    }
                }
                if (b.getTaille() == 3)
                {

                    nbsousMarin = nbsousMarin + 1;
                    if (nbsousMarin == 2)
                    {
                        _form.sousMarinGif.Visible = false;
                        _form.sousMarinNB.Visible = false;
                    }
                    else
                    {
                        _form.sousMarinNB.Text = "x1";
                    }
                }
                if (b.getTaille() == 2)
                {

                    nbTorpilleur = nbTorpilleur + 1;
                    if (nbTorpilleur == 2)
                    {
                        _form.torpilleurGif.Visible = false;
                        _form.torpilleurNB.Visible = false;
                    }
                    else
                    {
                        _form.torpilleurNB.Text = "x1";
                    }
                }
            }
            /*if (listeBateau.Count == 7)
            {
                
                _form.BateauAdversaire();
                _form.AddBateauxRobot(listeBateau);
                MessageBox.Show("Tous les bateaux ont été placés");
            }*/

        } // ajoute un bateau a la List et applique les changements sur la form x1/x2 ...
        public void BateauClicked(bool click, int taille) //si un bateau est sélectionné, enregistre sa taille, si il est déselectionner, remet les valeurs a 0
        {
            tailleBateauSelect = taille; // taille du bateau selectionner
            if (click) {
                bateauSelect = true;
            }
            else{
                premierClickDeCase = false;
                bateauSelect = false;
            }
        }
        private void EnleverBordures()
        {
            _form.croiseurGif.BorderStyle = BorderStyle.None;
            _form.sousMarinGif.BorderStyle = BorderStyle.None;
            _form.torpilleurGif.BorderStyle = BorderStyle.None;
            _form.porteAvionGif.BorderStyle = BorderStyle.None;
        } //enlève les bordures du bateau

        public bool GetBateauSelect()
        {
            return bateauSelect;
        } //retourne si un bateau a été sélectionné ou non pour préparé le placement

        private bool VerifCollision(int coordXouY, char gaucheDroite) //vérifie une collision 
        {
            //d'abords avec le décords
            int coord = coordXouY;
            int verifCo=0;
            bool coliBateaux=true;
            switch (gaucheDroite)
            {
                case 'g':
                    {
                        verifCo = coord - tailleBateauSelect;
                        break;
                    }
                case 'd':
                    {
                        verifCo = coord + tailleBateauSelect;
                        break;
                    }
                case 'h':
                    {
                        coord = coord - 10;
                        verifCo = coord + tailleBateauSelect;
                        break;
                    }
                case 'b':
                    {
                        coord = coord - 10;
                        verifCo = coord - tailleBateauSelect;
                        break;
                    }
                default :
                    break; 
            }
            //ensutie avec les bateaux
            foreach (Bateau bTest in listeBateau) //parcours de la list des bateaux
            {
                foreach (string cases in bTest.getCases()) //recupération des cases
                {
                    Bateau bateauVirtuel = new Bateau(tailleBateauSelect, gaucheDroite, coordY[0], coordX[0]);
                    //création du bateau virtuel afin de récupérer la mèthode getCases
                    foreach (string caseB in bateauVirtuel.getCases())
                    {
                        if (caseB == cases)
                        {
                            coliBateaux = false;
                        }
                    }
                }
            }
            // si les 
            if (verifCo <= 11 && verifCo >= 0 && coliBateaux== true)
            {
                return true;
            }
            else
            {
                if (coliBateaux == true)
                {
                    MessageBox.Show("Collision avec le décor détectée");
                }
                return false;
            }
 
        }

        private bool VerifCaseBateau(PictureBox pB)
        {
            foreach (Bateau b in listeBateau)
            {
                foreach (string cases in b.getCases())
                {
                    if (pB.Name == cases)
                    {
                        return false;
                    }
                }
            }
            return true;
        }  //vérifie les collisions avec la PicturBox passé en paramètre

        public void ClickPlacementBateau(string caseName, PictureBox pB) //premier click décide du point de départ, le deuxième décide de la verticalité/horrizontalité
        {
            string[] coords = caseName.Split(','); //sépare les coordonées en 2

            if (premierClickDeCase == false && VerifCaseBateau(pB))
            {
                coordX[0] = Convert.ToInt16(coords[1]); 
                coordY[0] = Convert.ToInt16(coords[0]);
                pB.ImageLocation = "noir.gif";
                premierClickDeCase = true;
                secondClickDeCase = false;
            }
            else 
            {
                if (secondClickDeCase == false)
                {
                    coordX[1] = Convert.ToInt16(coords[1]);
                    coordY[1] = Convert.ToInt16(coords[0]);
                    if (coordX[0] - 1 == coordX[1] && coordY[0] == coordY[1])
                    {
                        if (VerifCollision(coordX[0], 'g'))
                        {
                            Bateau b = new Bateau(tailleBateauSelect, caseName, 'g', 'h', coordY[0], coordX[0],_form); //crétion d'un nouveau bateau
                            AddBateau(b); // ajout du bateau a l'List
                            EnleverBordures();
                            b.DessinerBateau();
                            BateauClicked(false, 0);
                            secondClickDeCase = true;
                            verifTousBateauxPlaces();

                        }
                    }
                    if (coordX[0] + 1 == coordX[1] && coordY[0] == coordY[1])
                    {
                        if (VerifCollision(coordX[0], 'd'))
                        {
                            Bateau b = new Bateau(tailleBateauSelect, caseName, 'd', 'h', coordY[0], coordX[0], _form);
                            b.DessinerBateau();
                            EnleverBordures();
                            AddBateau(b);
                            BateauClicked(false, 0);
                            secondClickDeCase = true;
                            verifTousBateauxPlaces();
                        }
                    }
                    else
                    {
                        if (coordY[0] - 1 == coordY[1] && coordX[0] == coordX[1])
                        {
                            if (VerifCollision(coordY[0],'b'))
                            {
                                Bateau b = new Bateau(tailleBateauSelect, caseName, 'b', 'v', coordY[0], coordX[0], _form);
                                AddBateau(b);
                                EnleverBordures();
                                b.DessinerBateau();
                                verifTousBateauxPlaces();
                                BateauClicked(false, 0);
                                secondClickDeCase = true;
                            }

                        }
                        if (coordY[0] + 1 == coordY[1] && coordX[0] == coordX[1])
                        {

                            if (VerifCollision(coordY[0], 'h'))
                            {
                                Bateau b = new Bateau(tailleBateauSelect, caseName, 'h', 'v', coordY[0], coordX[0], _form);
                                AddBateau(b);
                                EnleverBordures();
                                b.DessinerBateau();
                                verifTousBateauxPlaces();
                                BateauClicked(false, 0);
                                secondClickDeCase = true;
                            }
                        }
                        else
                        {
                            if (secondClickDeCase == false)
                            {
                                coordX[1] = 0;
                                coordY[1] = 0;
                            }

                        }
                    }
                }
            }
        }


        public string GetCodeCase(int coordX, int coordY)
        {
            string codeCase;
            switch (coordY)
            { 
                case 11:
                    codeCase = "11,";
                    break;
                case 11+40:
                    codeCase = "12,";
                    break;
                case 11 + 40*2:
                    codeCase = "13,";
                    break;
                case 11 + 40*3:
                    codeCase = "14,";
                    break;
                case 11 + 40*4:
                    codeCase = "15,";
                    break;
                case 11 + 40*5:
                    codeCase = "16,";
                    break;
                case 11 + 40*6:
                    codeCase = "17,";
                    break;
                case 11 + 40*7:
                    codeCase = "18,";
                    break;
                case 11 + 40*8:
                    codeCase = "19,";
                    break;
                case 11 + 40*9:
                    codeCase = "20,";
                    break;
                default:
                    codeCase = "0";
                    break;
            }

            switch (coordX)
            {
                case 13:
                    codeCase += "1";
                    break;
                case 13 + 41:
                    codeCase += "2";
                    break;
                case 13 + 41 * 2:
                    codeCase += "3";
                    break;
                case 13 + 41 * 3:
                    codeCase += "4";
                    break;
                case 13 + 41 * 4:
                    codeCase += "5";
                    break;
                case 13 + 41 * 5:
                    codeCase += "6";
                    break;
                case 13 + 41 * 6:
                    codeCase += "7";
                    break;
                case 13 + 41 * 7:
                    codeCase += "8";
                    break;
                case 13 + 41 * 8:
                    codeCase += "9";
                    break;
                case 13 + 41 * 9:
                    codeCase += "10";
                    break;
                default:
                    codeCase = "0";
                    break;
            }
            return codeCase;
        } // renvoi le nom de la case en connaissant X et Y

        public List<Bateau> GetlesBateaux ()
        {
            return listeBateau;
        }

        private void verifTousBateauxPlaces()
        {
            if (listeBateau.Count == 7)
            {
                MessageBox.Show("Tous les bateaux ont été placés");
                _form.label41.Text = "Combattez";
                _form.BateauAdversaire();
                _form.AddBateauxRobot(listeBateau);
                
            } 
        }
    }
}
